package demo2;

public class Test {

    //字符串的不可变性

    //字符串的方法基本都是在新字符串上进行的，而不是在源字符串进行的
    //双引号引起来的都是放在常量池当中的----》如果有，就不存储，
    //直接返回字符串池的对象的地址即可
    //方法区从定位上来说，是一块独立的内存，但是方法区实际上是在堆当中的
    //常量池上的字符串  也是对象  也包含有value和hash两个东西


    //字符串类型当中的成员字符数组被封装，无法修改，该类没有提供set和get方法
    //final只是不能修改指向，不是不能修改数组元素的内容

    public static void main1(String[] args) {
        String str1 = "abcd";
        String str2 = new String("abcd");
        System.out.println(str1 == str2);
        String str3 = "abcd";
        System.out.println(str1 == str3);
    }
    //不建议在循环当中使用＋号对字符串进行拼接，建议使用两个sb
    public static void main2(String[] args) {
        String str = "hello";
        str += "abc";
        System.out.println(str);
    }

    public static void main3(String[] args) {
        String str = "hello";
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(str);
        stringBuilder.append("abc");
        str = stringBuilder.toString();
        System.out.println(str);
    }

    public static void main4(String[] args) {
        String str = "hello";
        for (int i = 0; i < 100; i++) {
            str += i;
        }
        System.out.println(str);
    }



    public static void main5(String[] args) {
        //可变字符串----->两个老sb

        StringBuffer stringBuffer = new StringBuffer("haha");
        StringBuilder stringBuilder = new StringBuilder("hehe");
        System.out.println(stringBuffer);
        System.out.println(stringBuilder);

    }

    public static void main6(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("1234");
        stringBuilder.append("2311");
        System.out.println(stringBuilder);
    }

    public static void main7(String[] args) {
        //stringbuffer 和stringbuilder
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("hahhhh");

        //逆置---》对自己进行逆置
        stringBuilder.reverse();
        System.out.println(stringBuilder);
        String str1 = stringBuilder.toString();
        System.out.println(str1);

    }

    public static void main8(String[] args) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("haha");

        //builder和buffer  的区别  buffer加锁了
        //builder 和buffer的内容都可以修改  可变字符串
        //string不可以修改 不可变字符串
        //buffer 线程安全  效率低下  开锁解锁都需要消耗资源（单线程情况下两个都可以）
        //builder 线程不安全 但是效率高

    }

    public static void main(String[] args) {
        //下面代码分别创建了多少string对象
        String str1 = new String("abc");  //2
        String str2 = new String("a") + new String("bc"); //5
        //此处还有一个stringbuilder对象，但是不是string对象，所以不加进去

    }

    //字符串常量池
    //双引号引起来的都放在字符串常量池
    //如果字符串常量池有，就直接拿，不需要创建
}
